/* *
* 在前端开发中，工厂模式是一种常用的设计模式，它用于创建对象，从而把对象的创建和使用分离开。通过工厂模式，可以避免在代码中直接使用new操作符创建对象，从而使代码更加灵活和易于维护。
* 在工厂模式中，有一个工厂对象，它负责创建一种或多种类型的对象。工厂对象中通常包含一个或多个工厂方法，每个工厂方法可以用来创建一个特定类型的对象。客户端可以通过调用工厂对象的工厂方法来创建对象，从而隐藏了对象的创建细节，增加了代码的灵活性和可维护性。
* 工厂模式有三种常见的实现方式：简单工厂模式、工厂方法模式和抽象工厂模式。其中，简单工厂模式通过一个工厂方法来创建对象，工厂方法模式则把创建对象的方法抽象成一个接口，由具体的工厂子类来实现，而抽象工厂模式则通过工厂类和具体实现类之间的多层继承结构来实现。
* 在实际应用中，工厂模式可以用于创建各种类型的对象，比如UI组件、数据访问对象、服务对象等。例如，我们可以通过工厂模式来创建各种类型的按钮、文本框、下拉框等UI组件，从而实现可复用和可扩展的UI组件库。
* 工厂->多个类  通过工厂.方法(类名)来创建类
* */
//? 简单工厂模式的动物工厂 通过一个工厂方法来创建对象
class AnimalFactory {
    static createAnimal(type) {
        switch (type) {
            //? 工厂里有Cat和Dog两个类
            case 'Cat':
                return new Cat();
            case 'Dog':
                return new Dog();
            default:
                throw 'Invalid animal type';
        }
    }
};
//? 定义 Cat 类型
class Cat {
    constructor() {
        this.name = 'Cat';
    }
    say() {
        console.log('Meow');
    }
};
//? 定义 Dog 类型
class Dog {
    constructor() {
        this.name = 'Dog';
    }
    say() {
        console.log('Woof');
    }
};

const myCat = AnimalFactory.createAnimal('Cat');
console.log(myCat.name); // 'Cat'
myCat.say(); // 'Meow'
const myDog = AnimalFactory.createAnimal('Dog');
console.log(myDog.name); // 'Dog'
myDog.say(); // 'Woof'


//? 抽象工厂模式的动物工厂 通过工厂类和具体实现类之间的多层继承结构
//? 定义抽象工厂类 AnimalAbstractFactory
class AnimalAbstractFactory {
    createCat() { }
    createDog() { }
}
//? 定义具体的工厂类 DomesticAnimalFactory
class DomesticAnimalFactory extends AnimalAbstractFactory {
    //? 重写方法
    createCat() {
        return new DomesticCat();
    }
    createDog() {
        return new DomesticDog();
    }
}
//? 定义 DomesticCat 类型，继承自 Cat 类型
class DomesticCat extends Cat {
    constructor() {
        super();
        this.type = 'Domestic';
    }
    say() {
        console.log('Meow');
    }
}
//? 定义 DomesticDog 类型，继承自 Dog 类型
class DomesticDog extends Dog {
    constructor() {
        super();
        this.type = 'Domestic';
    }
    say() {
        console.log('Woof');
    }
}
const factory = new DomesticAnimalFactory();
const myCat = factory.createCat();
console.log(myCat.name); // 'Cat'
console.log(myCat.type); // 'Domestic'
myCat.say(); // 'Meow'
const myDog = factory.createDog();
console.log(myDog.name); // 'Dog'
console.log(myDog.type); // 'Domestic'
myDog.say(); // 'Woof'
